﻿<?xml version="1.0" encoding="utf-8" ?>
<NClassify xsi:noNamespaceSchemaLocation="..\NClassify.Generator\NClassifyConfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <settings>
    <namespace>NClassify.Example</namespace>
    <xml-defaults form="element" namespace-uri="http://nclassify.com/schema/v1/example">
      <formatting type="dateTime" format="yyyy-MM-dd hh:mm:ss"/>
    </xml-defaults>
  </settings>

  <value name="SimpleInt32" base="int32">
    <validation>
      <range min="1" />
    </validation>
  </value>

  <enum name="SampleEnum">
    <value name="one" ordinal="1"/>
    <value name="two" ordinal="2"/>
    <value name="three" ordinal="3"/>
  </enum>

  <value name="SimpleBytes" base="bytes">
    <validation>
      <length min="1" max="255" />
    </validation>
  </value>

  <value name="SimpleText" base="string">
    <validation>
      <predefined>
        <value>abc</value>
        <value>def</value>
        <value>ghi</value>
        <value>jkl</value>
        <value>mno</value>
        <value>pqr</value>
        <value>stu</value>
        <value>vwx</value>
        <value>yz</value>
      </predefined>
    </validation>
  </value>
  
  <value name="simple_uri" base="string">
    <validation>
      <length min="8" max="2048" />
      <match ignoreCase="true" pattern="^https?\://.+" />
      <code language="C#" test="IsValidUri(value)">
        <!--signature is: bool IsValidUri(string value) {-->
        <method>
          global::System.Uri tmp;
          return global::System.Uri.TryCreate(value, global::System.UriKind.Absolute, out tmp);
        </method>
      </code>
    </validation>
  </value>
  <message name="CircleA">
    <fields>
      <message ordinal="1" name="B" type="CircleB"/>
    </fields>
  </message>
  <message name="CircleB">
    <fields>
      <message ordinal="1" name="A" type="CircleA"/>
    </fields>
  </message>
  <message name="CircleC" inherits="CircleA">
    <fields>
    </fields>
  </message>
  <message name="SampleMsg">
    <fields>
      <value ordinal="1" name="Id" type="SimpleInt32" default="0" />
      <value ordinal="2" name="uri" type="simple_uri" default="" />
      <value ordinal="3" name="alpha_group" type="SimpleText" use="required" default="abc" />
      <enum  ordinal="4" name="enum" type="SampleEnum" default="1" />
      <value ordinal="5" name="bytes" type="SimpleBytes" />

      <primitive ordinal="10" name="verified" type="bool" />
      <primitive ordinal="11" name="errors" type="string" array="true" direction="read-only" property="ReadErrors" access="protected">
        <validation>
          <length max="0"/>
        </validation>
      </primitive>
      
      <message ordinal="20" name="children" type="SampleMsg" array="true" />

      <primitive ordinal="31" name="dateModified" type="dateTime" array="true">
        <xml-options array-item-name="item" name="mod-date" form="element" format="yy-m-d" />
      </primitive>

      <!-- Intentional name collisions -->
      <primitive ordinal="100" name="IsValid" type="bool" />
      <primitive ordinal="102" name="AssertValid" type="bool" />
      <primitive ordinal="103" name="GetBrokenRules" type="bool" />
      <primitive ordinal="104" name="Clear" type="bool" />
      <primitive ordinal="105" name="Initialize" type="bool" />
      <primitive ordinal="106" name="MergeFrom" type="bool" />
      <primitive ordinal="107" name="MergeTo" type="bool" />
      <primitive ordinal="108" name="ReadXml" type="bool" />
      <primitive ordinal="109" name="WriteXml" type="bool" />
      <primitive ordinal="110" name="TypeFields" type="bool" />
    </fields>
  </message>

  <message name="SingleFields">
    <fields>
      <!-- The following are all valid types types of non-array fields -->
      <primitive ordinal="11" name="bool" type="bool" default="1" />
      <primitive ordinal="12" name="bytes" type="bytes" default="asdf" />
      <primitive ordinal="13" name="int8" type="int8" default="1" />
      <primitive ordinal="14" name="uint8" type="uint8" default="1" />
      <primitive ordinal="15" name="int16" type="int16" default="1" />
      <primitive ordinal="16" name="uint16" type="uint16" default="1" />
      <primitive ordinal="17" name="int32" type="int32" default="1" />
      <primitive ordinal="18" name="uint32" type="uint32" default="1" />
      <primitive ordinal="19" name="int64" type="int64" default="1" />
      <primitive ordinal="20" name="uint64" type="uint64" default="1" />
      <primitive ordinal="21" name="float" type="float" default="1" />
      <primitive ordinal="22" name="double" type="double" default="1" />
      <primitive ordinal="23" name="guid" type="guid" default="new()" />
      <primitive ordinal="24" name="dateTime" type="dateTime" default="now()" />
      <primitive ordinal="25" name="timeSpan" type="timeSpan" default="1:00" />
      <primitive ordinal="26" name="string" type="string" default="1" />
      <enum      ordinal="27" name="enum" type="SampleEnum" default="2" />
      <value     ordinal="28" name="simple_int32" type="SimpleInt32" default="2" />
      <value     ordinal="29" name="simple_uri" type="simple_uri" default="http://example.uri" />
      <value     ordinal="30" name="simple_text" type="SimpleText" use="required" default="def" />
      <value     ordinal="31" name="simple_bytes" type="SimpleBytes" default="AsdF12==" />
      <message   ordinal="32" name="sample_msg" type="SampleMsg" />
      <message   ordinal="33" name="i_sample_msg" type="ISampleMsg" />
    </fields>
  </message>

  <message name="ArrayFields">
    <fields>
      <!-- The following are all valid types types of array fields -->
      <primitive ordinal="11" name="bool" type="bool" array="true" />
      <primitive ordinal="12" name="bytes" type="bytes" array="true" />
      <primitive ordinal="13" name="int8" type="int8" array="true" />
      <primitive ordinal="14" name="uint8" type="uint8" array="true" />
      <primitive ordinal="15" name="int16" type="int16" array="true" />
      <primitive ordinal="16" name="uint16" type="uint16" array="true" />
      <primitive ordinal="17" name="int32" type="int32" array="true" />
      <primitive ordinal="18" name="uint32" type="uint32" array="true" />
      <primitive ordinal="19" name="int64" type="int64" array="true" />
      <primitive ordinal="20" name="uint64" type="uint64" array="true" />
      <primitive ordinal="21" name="float" type="float" array="true" />
      <primitive ordinal="22" name="double" type="double" array="true" />
      <primitive ordinal="23" name="guid" type="guid" array="true" />
      <primitive ordinal="24" name="dateTime" type="dateTime" array="true" />
      <primitive ordinal="25" name="timeSpan" type="timeSpan" array="true" />
      <primitive ordinal="26" name="string" type="string" array="true" />
      <enum      ordinal="27" name="enum" type="SampleEnum" array="true" />
      <value     ordinal="28" name="simple_int32" type="SimpleInt32" array="true" />
      <value     ordinal="29" name="simple_uri" type="simple_uri" array="true" />
      <value     ordinal="30" name="simple_text" type="SimpleText" use="required" array="true" />
      <value     ordinal="31" name="simple_bytes" type="SimpleBytes" array="true" />
      <message   ordinal="32" name="sample_msg" type="SampleMsg" array="true" />
      <message   ordinal="33" name="i_sample_msg" type="ISampleMsg" array="true" />
    </fields>
  </message>

  <service name="ExampleService">
    <method name="Ping" />
    <method name="Get" returns="ISampleMsg" />
    <method name="Put" argument="SampleMsg" returns="SampleMsg" />
    <method name="Delete" argument="ISampleMsg" />
  </service>

</NClassify>